home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / db / esm-3.1 / esm-3 / usr / local / sm / src / serverlib / trans / initializeTrans.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-05  |  5.4 KB  |  221 lines

  1. /*
  2.  *   $RCSfile: initializeTrans.c,v $  
  3.  *   $Revision: 1.1.1.1 $  
  4.  *   $Date: 1996/05/04 21:56:02 $      
  5.  */ 
  6. /**********************************************************************
  7. * EXODUS Database Toolkit Software
  8. * Copyright (c) 1991 Computer Sciences Department, University of
  9. *                    Wisconsin -- Madison
  10. * All Rights Reserved.
  11. *
  12. * Permission to use, copy, modify and distribute this software and its
  13. * documentation is hereby granted, provided that both the copyright
  14. * notice and this permission notice appear in all copies of the
  15. * software, derivative works or modified versions, and any portions
  16. * thereof, and that both notices appear in supporting documentation.
  17. *
  18. * THE COMPUTER SCIENCES DEPARTMENT OF THE UNIVERSITY OF WISCONSIN --
  19. * MADISON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" CONDITION.  
  20. * THE DEPARTMENT DISCLAIMS ANY LIABILITY OF ANY KIND FOR ANY DAMAGES
  21. * WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
  22. *
  23. * The EXODUS Project Group requests users of this software to return 
  24. * any improvements or extensions that they make to:
  25. *
  26. *   EXODUS Project Group 
  27. *     c/o David J. DeWitt and Michael J. Carey
  28. *   Computer Sciences Department
  29. *   University of Wisconsin -- Madison
  30. *   Madison, WI 53706
  31. *
  32. *     or exodus@cs.wisc.edu
  33. *
  34. * In addition, the EXODUS Project Group requests that users grant the 
  35. * Computer Sciences Department rights to redistribute these changes.
  36. **********************************************************************/
  37.  
  38. #include "sysdefs.h"
  39. #include "ess.h"
  40. #include "checking.h"
  41. #include "trace.h"
  42. #include "error.h"
  43. #include "list.h"
  44. #include "pool.h"
  45. #include "tid.h"
  46. #include "io.h"
  47. #include "lock.h"
  48. #include "object.h"
  49. #include "msgdefs.h"
  50. #include "thread.h"
  51. #include "semaphore.h"
  52. #include "link.h"
  53. #include "lsn.h"
  54. #include "latch.h"
  55. #include "bf.h"
  56. #include "volume.h"
  57. #include "trans.h"
  58. #include "util_funcs.h"
  59. #include "trans_intfuncs.h"
  60. #include "trans_extfuncs.h"
  61. #include "bf_globals.h"
  62. #include "trans_globals.h"
  63.  
  64.  
  65.  void
  66. initializeTrans ()
  67.  
  68. {
  69.  
  70.     TRANSVOLREC    *transVolRec;
  71.     TRANSREC    *transRec;
  72.     int            spaceNeeded;
  73.     int            i;
  74.  
  75.     TRACE(TR_TRANS, TR_LEVEL_1);
  76.  
  77.     /*
  78.      *    Initialize the transaction pool and active list
  79.      */
  80.     initializePool( &TransRecPool, (ALLOCFUNC) allocTransRec, NumTransRecs );
  81.     initializeList( &ActiveTransList );
  82.     
  83.     /*
  84.      *    calculate how much space to allocate for transaction records
  85.      */
  86.     spaceNeeded = sizeof(TRANSREC) * NumTransRecs;
  87.  
  88.     /*
  89.      *    Attempt to allocate the space
  90.      */
  91.     if ((TransRecPtr = transRec = (TRANSREC *) malloc(spaceNeeded)) == NULL)    {
  92.  
  93.         SM_ERROR(TYPE_FATAL, esmMALLOCFAILED);
  94.     }
  95.  
  96.     /*
  97.      *    initialize the individual transaction records
  98.      */
  99.     for (i = 0; i < NumTransRecs; i++, transRec++)    {
  100.  
  101.         /*
  102.          * Initialize the transaction record.
  103.          */
  104.         initTransRec(transRec);
  105.  
  106.         /*
  107.          *    put the record in the pool
  108.          */
  109.         listEnq( &(TransRecPool.freeList), &(transRec->tidList) );
  110.  
  111.     }
  112.  
  113.     /*
  114.      *    get the size of the transaction hash table
  115.      *    and setup the hash mask
  116.      */
  117.     TransTableSize = findLog2(NumTransRecs);
  118.     TransHashMask = TransTableSize - 1;
  119.     TRPRINT(TR_TRANS, TR_LEVEL_2, ("TransTableSize:%d TransHashMask:%d",
  120.            TransTableSize, TransHashMask));
  121.     TransTableSize = RAISETWO(TransTableSize);
  122.  
  123.     /*
  124.      *    get the space needed for the transaction table
  125.      */
  126.     spaceNeeded = TransTableSize * sizeof(LIST);
  127.  
  128.     /*
  129.      *    Attempt to allocate the space
  130.      */
  131.     if ((TransHashTable = (LIST *) malloc(spaceNeeded)) == NULL)    {
  132.  
  133.         SM_ERROR(TYPE_FATAL, esmMALLOCFAILED);
  134.     }
  135.  
  136.     /*
  137.      *    initialize the individual transaction records
  138.      */
  139.     for (i = 0; i < TransTableSize; i++)    {
  140.  
  141.         /*
  142.          *    initialize the list components
  143.          */
  144.         initializeList( &(TransHashTable[i]) );
  145.     }
  146.  
  147.     /*
  148.      *    initialize the transvol pool
  149.      */
  150.     initializePool( &TransVolRecPool, NULL, NumTransVolRecs );
  151.  
  152.     /*
  153.      *    get the space needed for the transaction table
  154.      */
  155.     spaceNeeded = NumTransVolRecs * sizeof(TRANSVOLREC);
  156.  
  157.     /*
  158.      *    Attempt to allocate the space
  159.      */
  160.     if ((transVolRec = (TRANSVOLREC *) malloc(spaceNeeded)) == NULL)    {
  161.  
  162.         SM_ERROR(TYPE_FATAL, esmMALLOCFAILED);
  163.     }
  164.  
  165.     /*
  166.      *    initialize the individual transaction records
  167.      */
  168.     for (i = 0; i < NumTransVolRecs; i++, transVolRec++)    {
  169.  
  170.         initializeListElement( &(transVolRec->volumeList), (char *) transVolRec );
  171.         initializeListElement( &(transVolRec->transList), (char *) transVolRec );
  172.         INIT_TRANSVOLREC_MAGIC(transVolRec);
  173.  
  174.         listEnq( &(TransVolRecPool.freeList), &(transVolRec->volumeList) );
  175.     }
  176.  
  177.     /*
  178.      *    initialize the transaction info structure
  179.      */
  180.     TransInfo.transState = T_ACTIVE;
  181.     TransInfo.logState   = L_OFFLINE;
  182.     TransInfo.tidSequence = 1; /* MJZ: added -- Tid 0 is special */
  183.  
  184.     /*
  185.      *    Init the shutdown wait list
  186.      */
  187.     initializeList( &TransShutdownWaitList );
  188.  
  189.     /*
  190.      *    calculate how much space to allocate for the dirty pages table
  191.      */
  192.     DirtyPageTableMaxSize = NumBuffers;
  193.     spaceNeeded = sizeof(DIRTYPAGEINFO) * DirtyPageTableMaxSize;
  194.  
  195.     /*
  196.      *    Attempt to allocate the space
  197.      */
  198.     if ((DirtyPageTable = (DIRTYPAGEINFO *) malloc(spaceNeeded)) == NULL)    {
  199.  
  200.         SM_ERROR(TYPE_FATAL, esmMALLOCFAILED);
  201.     }
  202.  
  203.     /*
  204.      *    calculate how much space to allocate holding are for log 
  205.      *    information listing dirty pages.  Initialize the semaphore
  206.      *    for this table.
  207.      */
  208.     spaceNeeded = sizeof(DIRTYPAGELOGINFO) * DirtyPageTableMaxSize;
  209.     initializeSemaphore(&DirtyPageLogInfoSemaphore, FALSE);
  210.  
  211.     /*
  212.      *    Attempt to allocate the space
  213.      */
  214.     if ((DirtyPageLogInfo = (DIRTYPAGELOGINFO *) malloc(spaceNeeded)) == NULL)    {
  215.  
  216.         SM_ERROR(TYPE_FATAL, esmMALLOCFAILED);
  217.     }
  218.  
  219.     initializeRecoveryDirtyPageTable();
  220. }
  221.